Linux 多版本程序管理:update-alternatives
同一台 Linux 机器上,不同项目对同一程序的要求可能不同:老工程要 cmake 3.16,新工程要 3.20。Debian 系发行版自带的 update-alternatives 就是为此设计的——把多个版本的同一程序注册到一个统一的命令名下,按优先级决定默认版本,一条命令交互切换。本文以管理两个 cmake 版本为例,覆盖注册、切换、验证的完整流程。适合需要在系统级共存多个工具版本的开发者。
工作原理
update-alternatives 维护一条两级符号链接链:/usr/bin/cmake 指向 /etc/alternatives/cmake,后者再指向实际程序路径(如 ~/opt/cmake-3.20.0/bin/cmake)。切换版本只是重指这条链,所有通过 /usr/bin/cmake 调用的程序(包括 ctest、cpack 等同目录工具)自动跟随,系统级生效、对所有用户可用。
注册多个版本
sudo update-alternatives --install /usr/bin/cmake cmake ~/opt/cmake-3.16.3/bin/cmake 20
sudo update-alternatives --install /usr/bin/cmake cmake ~/opt/cmake-3.20.0/bin/cmake 10 四个参数依次是:链接路径(统一的命令入口)、名称(标识这组备选)、实际程序路径、优先级。优先级数字越大越优先,自动模式下系统选择优先级最高的版本——上面的例子里默认版本是 3.16.3。
切换版本
sudo update-alternatives --config cmake 交互式选择:
There are 2 choices for the alternative cmake (providing /usr/bin/cmake).
Selection Path Priority Status
------------------------------------------------------------
* 0 /home/user/opt/cmake-3.16.3/bin/cmake 20 auto mode
1 /home/user/opt/cmake-3.16.3/bin/cmake 20 manual mode
2 /home/user/opt/cmake-3.20.0/bin/cmake 10 manual mode
Press <enter> to keep the current choice[*], or type selection number: 输入编号回车即可切换。这里有两种模式值得区分:
- auto mode(编号 0):跟随优先级自动选择,注册新版本后默认指向可能变化;
- manual mode(编号 1、2):固定使用选定版本,不再随优先级变动。
直接回车保持当前选择不变。
验证
cmake --version 输出即当前选中的版本。切换后无需重新登录或刷新缓存。
适用边界
update-alternatives 适合 cmake、gcc、python 这类「一个命令入口、多版本共存」的系统程序。它的局限同样明显:按命令全局切换,不能按项目自动选择版本。如果管理的是 Node.js、Python 这类有专用版本管理器(nvm、Volta、pyenv 等)的运行时,且需要进入项目目录自动切换,用专用工具更合适;系统级、手动切换的场景,update-alternatives 足够且零依赖。